package com.mornd.gulimall.product.service;

import com.mornd.gulimall.product.entity.Category;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mornd.gulimall.product.entity.vo.Catalog2Vo;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * <p>
 * 商品三级分类 服务类
 * </p>
 *
 * @author mornd
 * @since 2023-07-23
 */
public interface ICategoryService extends IService<Category> {

    /**
     * 从 cache 中获取所有分类集合
     * @return
     */
    List<Category> getCategoryList();

    /**
     * 从 cache 中获取所有分类集合，并使用分布式锁保证锁过期时，只查一次 db
     * @return
     */
    List<Category> getCategoryListWithMutex();

    /**
     * 从 cache 中获取所有分类集合，redisson 实现分布式锁
     * @return
     */
    List<Category> getCategoryListWithReentrantLock();

    /**
     * 封装成树形结构
     * @return
     */
    Map<String, Object> tree();

    Optional<Category> getCacheById(Serializable id);

    String getCacheNameById(Serializable id);

    void updateCascade(Category category);

    void delete(Long id);

    /**
     * 是否是叶子节点
     * @param id
     * @return
     */
    boolean isLeaf(Long id);

    boolean batchDelete(List<Long> ids);

    /**
     * 获取 category 的完整路径
     * @param id
     * @return
     */
    List<Long> from(Long id);

    /**
     * 根据 level 获取分类集合
     * @return
     */
    List<Category> getLevelCategorys(int level);

    /**
     * 查询所有二级和三级分类
     * @return
     */
    Map<String, List<Catalog2Vo>> getCatalogJson();
}
